package arrays;

import algorithm.sort.InputSequence;

import java.util.Arrays;
import java.util.List;

/**
 * 复制数组
 * System.arraycopy()       浅度复制
 * System中提供了一个native静态方法arraycopy(),可以使用这个方法来实现数组之间的复制
 * 对于一维数组来说，这种复制属性值传递，修改副本不会影响原来的值
 * 对于二维或者一维数组中存放的是对象时，复制结果是一维的引用变量传递给副本的一维数组，修改副本时，会影响原来的数组
 * System.arraycopy的函数原型是：
 * public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
 *      src     源数组
 *      srcPos  源数组要复制的起始位置
 *      dest    目标数组
 *      destPos 目标数组的起始位置
 *      length  要复制的长度
 *
 * 深度复制和浅度复制的区别
 *      Java数组的复制操作可以分为深度复制和浅度复制
 *      深度复制，可以将对象的值和对象的内容复制
 *      浅复制是指对对象引用的复制
 *
 *
 *
 * Arrays.copyOf()
 * 原型：
 * @SuppressWarnings("unchecked")
 * public static <T> T[] copyOf(T[] original, int newLength) {
 *     return (T[]) copyOf(original, newLength, original.getClass());
 * }
 *          original    要复制的数组
 *          newLength   要返回的副本的长度
 *
 * public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
 *     @SuppressWarnings("unchecked")
 *     T[] copy = ((Object)newType == (Object)Object[].class)
 *         ? (T[]) new Object[newLength]
 *         : (T[]) Array.newInstance(newType.getComponentType(), newLength);
 *     System.arraycopy(original, 0, copy, 0,
 *                      Math.min(original.length, newLength));
 *     return copy;
 * }
 *          newType     要返回的副本的类型
 *
 *
 *
 * 静态方法
 * Arrays.asList()
 * List<E> asList(E[] es)     将数组转化成List集合，此方法得到的List的长度是不可改变的（有坑）
 *          该方法返回一个ArrayList集合，但不能增删元素，
 *          ArrayList指向原数组array，修改原数组时集合也会改变，即两者指向同一对象
 *          java.util.Arrays.ArrayList
 *
 * */
public class ArraysDemo {
    int[] a;
    public ArraysDemo() {
        a = InputSequence.randomIntArray(10, 10, 100);
    }
    public void demo1() {
        int[] b = new int[a.length];
        System.arraycopy(a,0, b, 0, a.length);
        for (int j : b) System.out.print(j + " ");
        System.out.println("\n");
    }
    public void demo2() {
        int[] b = Arrays.copyOf(a, a.length);
        for (int j : b) System.out.print(j + " ");
        System.out.println();
        b = Arrays.copyOf(b,b.length + 10);   // 扩容
        for (int j : b) System.out.print(j + " ");
        System.out.println("\n");
    }
    public void demo3() {   // 排序
        Arrays.sort(a);     // 升序排序
        for (int j : a) System.out.print(j + " ");
        System.out.println("\n");
    }

    public void toList() {  // 数组转换成List集合
        String[] strings = {"a", "k", "m", "r", "d", "c"};
        List<String> stringList = Arrays.asList(strings);   // 得到的List的长度是不可改变的
        for (String str : stringList)
            System.out.println(str);
//        stringList.add("ff");   // 会报错，抛出UnsupportedOperationException异常
//        stringList.add("gg");
//        for (String str : stringList)
//            System.out.println(str);
    }

    public static void main(String[] args) {
        ArraysDemo ad = new ArraysDemo();
        ad.demo1();
        ad.demo2();
        ad.demo3();
        ad.toList();
    }
}
